package eval

import (
	"fmt"
	"showen/lex"
	"showen/obj"
	"showen/parse"
	"testing"
)

func TestVector(t *testing.T) {
	tests := []struct {
		input    string
		expected string
	}{
		{
			"'#()",
			"#()",
		},
		{
			"'#(1 2 3)",
			"#(1 2 3)",
		},
		{
			"'#(1 \"hello\" #t)",
			"#(1 \"hello\" #t)",
		},
		{
			"'#(#(1 2) #(3 4))",
			"#(#(1 2) #(3 4))",
		},
	}

	env := obj.NewEnvironment()
	RegisterBuiltinProcedures(env)

	for _, tt := range tests {
		fmt.Printf("Testing input: %s\n", tt.input)
		
		lexer := lex.NewLexer(tt.input)
		tokens := lexer.ReadTokens()
		fmt.Printf("Tokens: %+v\n", tokens)
		
		parser := parse.NewParser(tokens)
		expr, err := parser.ParseExpression()
		if err != nil {
			t.Fatalf("ParseExpression() error = %v", err)
		}

		result, err := EvalExpression(expr, env)
		if err != nil {
			t.Fatalf("EvalExpression() error = %v", err)
		}

		if result.Inspect() != tt.expected {
			t.Errorf("For input %q, expected %q, got %q", tt.input, tt.expected, result.Inspect())
		}
	}
}